好的那我們昨天用ROS的parameter server
建立了一個叫做/print_frq
的變數,今天就來看看要怎麼在程式中使用吧! 一樣會分成python
和c++
兩個版本:
python
:rospy.get_param('/param_name', 'default_value')
在python
裡面很簡單的就是call rospy
內的api get_param
,它可以有兩個參數,第一個參數就是我們設定的parameter
的名稱啦! 第二個參數是用在如果他在parameter server
裡面找不到我們設定的parameter
時,會給的預設值。
所以修改我們之前的hello.py
,就會長這樣:
import rospy # import rospy 模組
rospy.init_node('hello_python_node') # 初始化 hello_python_node
frq = rospy.get_param("/print_frq") # 讀取parameter server 內的參數/print_frq
while not rospy.is_shutdown(): # 在 rospy 還沒結束前,執行下列指令:
rospy.loginfo('Hello World') # 印出 Hello World
rospy.sleep(frq) # 間隔 frq 秒
這樣就完成啦! 大家可以自己修改看看/print_frq
那個參數,看看是否真的會因此而改變印出Hello World
的頻率喔!
c++
:get parameter
的實作是在handler
內,所以要呼叫的是handler
裡面的api:ros::NodeHandle nh;
int param;
nh.getParam("/param_name", param);
需要注意的是,getParam()
的用法是將第一個參數撈到的值放入第二個參數內,所以要先定義好我們要放的變數型別,之後才能呼叫這個函式。因此,hello.cpp
的程式碼會長這樣:
#include <ros/ros.h> // 引用 ros.h 檔
int main(int argc, char** argv){
ros::init(argc, argv, "hello_cpp_node"); // 初始化hello_cpp_node
ros::NodeHandle handler; // node 的 handler
double frq;
handler.getParam("/print_frq", frq);
while (ros::ok()){ // 在 ros 順利執行時
ROS_INFO("Hello World!"); // 印出 Hello World
ros::Duration(frq).sleep(); // 間隔 frq 秒
}
}
修改完以後要重新執行catkin_make
進行編譯的動作,才能執行hello.exe
檔喔!這之後修改parameter server
內的參數,就不用再重新編譯一次檔案啦! 這對c++的檔案來說真的很方便~
當然在python
與c++
的程式內不只可以使用get parameter
,一樣可以使用set
/delete
等指令,這部分就比較簡單,我就不多作介紹啦!
rospy tutorial - using parameters
rospy overview - parameters
roscpp overview - parameters